iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

自己的 Leak, 自己抓(swift)系列 第 26

番外: IndexStore DB

  • 分享至 

  • xImage
  •  

之前有稍微提到 IndexStore DB

Repo

IndexStore DB


引入準備

lib 位置

首先是 libIndexStore.dylib 位置

通常是位於:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libIndexStore.dylib

我們可透過取得某工具的路徑 xcrun --find sourcekit-lsp,再以相對路徑取得 libIndexStore.dylib

xcrun --find sourcekit-lsp
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/sourcekit-lsp

Store 位置

  • xcode
    • 位於 derived path
  • spm
    • 位於 .build

Database 位置

應該可以隨意指定

因此先放在 NSTemporaryDirectory

Wait

db 初始化完畢後

需要做 indexing, 也就是 db.pollForUnitChangesAndWait()


完整 code

//
//  IndexDB.swift
//

import Foundation
import IndexStoreDB

public struct IndexStore {
    private static let defaultLibPath: String = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libIndexStore.dylib"

    public let db: IndexStoreDB

    public init?(path: String) {
        guard let lspPath: String = Exec.run(
            "/usr/bin/xcrun",
            "--find", "sourcekit-lsp"
        ).string else { return nil }

        let indexStoreLibPath: URL = URL(fileURLWithPath: lspPath)
            .deletingLastPathComponent()
            .deletingLastPathComponent()
            .appendingPathComponent("lib/libIndexStore.dylib")

        let libPath: String = indexStoreLibPath.path

        do {
            try self.db = IndexStoreDB(
                storePath: path,
                databasePath: NSTemporaryDirectory() + "index_\(getpid())",
                library: IndexStoreLibrary(dylibPath: libPath)
            )
            db.pollForUnitChangesAndWait()
        } catch {
            print(error)
            return nil
        }
    }
}

上一篇
實作 Assign Visitor
下一篇
番外: Derived Path
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言